import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JButton;
import javax.swing.JMenu;
import javax.swing.JOptionPane;
import javax.swing.JProgressBar;
import javax.swing.JTextField;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;
import javax.swing.plaf.ProgressBarUI;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;

import java.awt.Desktop;
import java.awt.Dimension;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;

import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
/**
Autore:Stefano Ricciardi
Rilasciato sotto licenza GNU LGPL 3.0
*/

public class FormSincronizzaIscrizioni extends JFrame {
	private JTextField textField;
	private JTable table;
	private DefaultTableModel tableModel;
	
	static{
		System.setProperty("sun.net.client.defaultReadTimeout", "40000");
		System.setProperty("sun.net.client.defaultConnectTimeout", "40000");
		try {
		    for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
		        if ("Nimbus".equals(info.getName())) {
		            UIManager.setLookAndFeel(info.getClassName());
		            break;
		        }
		    }
		} catch (Exception e) {
		    // If Nimbus is not available, you can set the GUI to another look and feel.
		}
	}
	
	public FormSincronizzaIscrizioni() {
		setAutoRequestFocus(false);
		getContentPane().setLayout(null);
		final JButton btnCambia = new JButton("Cambia");
		setTitle("Iscrizioni Catechismo");
		JLabel lblNumeroDiIscrizioni = new JLabel("Numero di iscrizioni : ");
		lblNumeroDiIscrizioni.setBounds(64, 44, 190, 25);
		getContentPane().add(lblNumeroDiIscrizioni);
		
		final JLabel labelNumScaricati = new JLabel("");
		final IscrizioniManager im=new IscrizioniManager();
		
		try {
			labelNumScaricati.setText(im.getUltimoIdScaricato()+"");
		} catch (IOException e2) {
			// TODO Auto-generated catch block
			e2.printStackTrace();
		}
		labelNumScaricati.setBounds(220, 44, 47, 25);
		getContentPane().add(labelNumScaricati);
		
		JLabel label_1 = new JLabel("Nuove iscrizioni : ");
		label_1.setBounds(64, 120, 190, 25);
		getContentPane().add(label_1);
		
		final JLabel labelNuove = new JLabel("");
		try {
			int numScaricati=im.getUltimoIdScaricato();
			int nuovoId=im.getLastIdFromWeb(IscrizioniManager.mySite+"statusmid.php");
			int nuovi=nuovoId-numScaricati;
			labelNuove.setText(""+nuovi);
			
			
			//labelNumScaricati.setText(im.getUltimoIdScaricato()+"");
		} catch (IOException e2) {
			// TODO Auto-generated catch block
			e2.printStackTrace();
		}
		final JProgressBar progressBar = new JProgressBar();
		final JButton button = new JButton("Aggiorna");
		labelNuove.setBounds(220, 120, 190, 25);
		getContentPane().add(labelNuove);
		
		final JButton btnSincronizzaEScarica = new JButton("Scarica le nuove iscrizioni");
		btnSincronizzaEScarica.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				try{
					Thread t=new Thread(new Runnable() {
						
						@Override
						public void run() {
							btnSincronizzaEScarica.setEnabled(false);
							button.setEnabled(false);
							btnCambia.setEnabled(false);
							int ultidsca=0;
							int ddd=0;
							try{
								ultidsca=im.getUltimoIdScaricato();
								ddd=im.getLastIdFromWeb("");
								
							}catch(Exception rre){
								JOptionPane.showMessageDialog(FormSincronizzaIscrizioni.this,"Controlla la connessione ad internet e riprova");
								return;
							}
							
									
							int scaricati=ultidsca;//new Integer(labelNumScaricati.getText());
							
							int numNuove=ddd-ultidsca;//new Integer(labelNuove.getText());
							for(int i=scaricati+1;i<=(scaricati+numNuove);i++){
								progressBar.setMaximum(numNuove);
								try{
									
									boolean res=im.getPdfIscrizioneFromWeb(i,textField.getText());
									
									im.setUltimoIdScaricato(i);
									
									progressBar.setValue(i-scaricati);
										
									
								}catch(Exception gg){
									JOptionPane.showMessageDialog(null, "Errore durante il download. Controlla la connessione\n e la cartella di destinazione e riprova.");
									button.setEnabled(true);
									button.doClick();
									btnSincronizzaEScarica.setEnabled(true);
									btnCambia.setEnabled(true);
									
									
									return;
								}
								
							}
							progressBar.setValue(0);
							btnSincronizzaEScarica.setEnabled(true);
							button.setEnabled(true);
							btnCambia.setEnabled(true);
							button.doClick();
							JOptionPane.showMessageDialog(null,"Download effettuato con successo");
						}
					});
					t.start();
					
				}catch(Exception p){
					
				}
				
				
			}
		});
		btnSincronizzaEScarica.setBounds(349, 109, 286, 36);
		getContentPane().add(btnSincronizzaEScarica);
		
		
		progressBar.setMinimum(0);
		progressBar.setMaximum(0);
		try{
			progressBar.setMaximum(new Integer(labelNuove.getText()).intValue());
		}catch(Exception r){
			r.printStackTrace();
		}
		
		progressBar.setBounds(349, 152, 286, 25);
		getContentPane().add(progressBar);
		//progressBar.setValue(4);
		
		textField = new JTextField();
		textField.setEnabled(false);
		textField.setBounds(396, 44, 222, 22);
		getContentPane().add(textField);
		//textField.setColumns(10);

		try {
			textField.setText(im.getDir()+"");
		} catch (IOException e2) {
			// TODO Auto-generated catch block
			e2.printStackTrace();
		}
		final JFrame inst=this;
		
		btnCambia.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				JFileChooser jfc=new JFileChooser(){

					@Override
					public void approveSelection() {
						for(int i=tableModel.getRowCount()-1;i>=0;i--){
							tableModel.removeRow(i);
						}
						for(File f :this.getSelectedFile().listFiles()){
							if(f.getName().toUpperCase().endsWith(".PDF")){
								tableModel.addRow(new Object[]{f.getName()});
							}
						}
						textField.setText(this.getSelectedFile().getAbsolutePath());
						try {
							IscrizioniManager im=new IscrizioniManager();
							im.setUltimoIdScaricato(textField.getText());
							//labelNumScaricati.setText(im.getDir()+"");
						} catch (IOException e2) {
							// TODO Auto-generated catch block
							e2.printStackTrace();
						}
						super.approveSelection();
						
					}
					
				};
				jfc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
				jfc.setMultiSelectionEnabled(false);
				jfc.showOpenDialog(inst);
				
			}
		});
		btnCambia.setBounds(258, 41, 122, 25);
		getContentPane().add(btnCambia);
		
		JLabel lblCartellaDelleIscrizioni = new JLabel("Cartella delle iscrizioni");
		lblCartellaDelleIscrizioni.setBounds(396, 20, 222, 15);
		getContentPane().add(lblCartellaDelleIscrizioni);
		
		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setBounds(64, 199, 571, 134);
		getContentPane().add(scrollPane);
		
		table = new JTable(){

			@Override
			public boolean isCellEditable(int row, int column) {
				// TODO Auto-generated method stub
				return false;
			}
			
		};
		tableModel=new DefaultTableModel(new Object[][]{},new Object[]{"File"});
		table.setModel(tableModel);
		table.setAutoCreateRowSorter(true);
		table.addMouseListener(new MouseAdapter() {

			@Override
			public void mouseClicked(MouseEvent e) {
				// TODO Auto-generated method stub
				if(e.getClickCount()==2){
					int row=table.rowAtPoint(e.getPoint());
					if(row!=-1){
						String nomeFile=table.getValueAt(row, 0).toString();
						String path=textField.getText()+File.separator+nomeFile;
						try {
							//JOptionPane.showMessageDialog(null,path);
							Desktop.getDesktop().open(new File(path));
						} catch (IOException e1) {
							// TODO Auto-generated catch block
							e1.printStackTrace();
						}
					}
				}
				//super.mouseClicked(e);
			}
			
		});
		scrollPane.setViewportView(table);
		
		
		button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				DefaultTableModel dtm=(DefaultTableModel) table.getModel();
				for(int i=table.getModel().getRowCount()-1;i>=0;i--){
					dtm.removeRow(i);
				}
				IscrizioniManager im=new IscrizioniManager();
				int ultimoId=0;
				
				try {
					int lastid=im.getUltimoIdScaricato();
					labelNumScaricati.setText(lastid+"");
					File f=new File(im.getDir());
					try{
						File[] ffs=f.listFiles(new FilenameFilter() {

							@Override
							public boolean accept(File dir, String name) {
								try{
									if(name.length()==19 && name.toUpperCase().endsWith("-ISCRIZIONE.PDF") && new Integer(name.toUpperCase().replace("-ISCRIZIONE.PDF",""))>0 ){
										return true;
									}
								}catch(Exception rrt){

								}
								return false;
							}
						});
						labelNumScaricati.setText(ffs.length+"");
					}catch(Exception oor){
						
					}
					
					//getNumNuoveIscrizioni()
					
				} catch (IOException e2) {
					// TODO Auto-generated catch block
					e2.printStackTrace();
				}
				
				try {
					int numScaricati=im.getUltimoIdScaricato();
					int nuovoId=im.getLastIdFromWeb(IscrizioniManager.mySite+"statusmid.php");
					int nuovi=nuovoId-numScaricati;
					labelNuove.setText(""+nuovi);
					labelNuove.setText(im.getNumNuoveIscrizioni(numScaricati)+"");
					
					
					//labelNumScaricati.setText(im.getUltimoIdScaricato()+"");
				} catch (IOException e2) {
					// TODO Auto-generated catch block
					e2.printStackTrace();
				}
				
				try {
					//IscrizioniManager im=new IscrizioniManager();
					
					textField.setText(im.getDir());
					//labelNumScaricati.setText(im.getDir()+"");
				} catch (IOException e2) {
					// TODO Auto-generated catch block
					e2.printStackTrace();
				}
				try{
					for(File f :new File(textField.getText()).listFiles()){
						if(f.getName().toUpperCase().endsWith(".PDF")){
							tableModel.addRow(new Object[]{f.getName()});
						}
					}
				}catch(Exception f){
					f.printStackTrace();
				};
				//textField.setText(this.getSelectedFile().getAbsolutePath());
			/*	try {
					//IscrizioniManager im=new IscrizioniManager();
					//im.setUltimoIdScaricato(textField.getText());
					//labelNumScaricati.setText(im.getDir()+"");
				} catch (IOException e2) {
					// TODO Auto-generated catch block
					e2.printStackTrace();
				}*/
				
			}
		});
		button.setBounds(74, 83, 117, 25);
		getContentPane().add(button);
		
		JButton jButtonApriCartella = new JButton("Apri Cartella");
		jButtonApriCartella.setBounds(258, 70, 122, 25);
		jButtonApriCartella.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				try {
					if(textField.getText().isEmpty()){
						JOptionPane.showMessageDialog(FormSincronizzaIscrizioni.this,"Devi selezionare prima una cartella cliccando su Cambia");
						return;
					}
					Desktop.getDesktop().open(new File(textField.getText()));
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
				
				
			}
		});
		getContentPane().add(jButtonApriCartella);
		
		JMenuBar menuBar = new JMenuBar();
		setJMenuBar(menuBar);
		
		JMenu mntmFile = new JMenu("File");
		JMenuItem exit=new JMenuItem("Esci");
		exit.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				System.exit(0);
			}
		});
		
		mntmFile.add(exit);
		menuBar.add(mntmFile);
		
		
		JMenu mntmOpzioni = new JMenu("Opzioni");
		JMenuItem nomeUtenteEPassword=new JMenuItem("Configura utente");
		nomeUtenteEPassword.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				PanelUserEPass pup=new PanelUserEPass(false);
				pup.setVisible(true);
			}
		});
		mntmOpzioni.add(nomeUtenteEPassword);
		JMenuItem itemCartella=new JMenuItem("Cambia cartella");
		itemCartella.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				btnCambia.getActionListeners()[0].actionPerformed(null);
				
			}
		});
		mntmOpzioni.add(itemCartella);
		JMenu azzeraMenu=new JMenu("  Nuovo Anno Pastorale  ");
		JMenuItem azzeraMenuItem=new JMenuItem("Cancella dati e pdf iscrizioni");
		azzeraMenuItem.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				IscrizioniManager im=new IscrizioniManager();
				try {
					im.azzeraTutto(FormSincronizzaIscrizioni.this);
					button.doClick();
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
					
				}
				
			}
		});
		azzeraMenu.add(azzeraMenuItem);
		
		JMenu help=new JMenu("?");
		JMenuItem about=new JMenuItem("Circa GeICat");
		about.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				JOptionPane.showMessageDialog(FormSincronizzaIscrizioni.this, "Gestione Iscrizioni Catechismo versione 2.0\n\n\nAutore: Stefano Ricciardi\nContatti: ste10487@yahoo.it\n\nIl software è distribuito così com'è. Non è consentita nessuna operazione volta a recuperare il codice sorgente come la decompilazione o disassemblazione.\n Non è consentita alcuna modifica non autorizzata.\nE' vietato l'impiego del software per qualsiasi attività che preveda fini di lucro.\nE' consentito l'uso del software a titolo gratuito.\nE' consentita la copia e la distribuzione purchè non prevedano nessun tipo di lucro neanche associati ai servizi di distribuzione impiegati.\nL'autore del software solleva ogni responsabilità circa usi impropri del programma che non siano a norma di legge.\nIl software utilizza il protocollo HTTP per tutti i trasferimenti di dati.");
				
			}
		});
		help.add(about);
		menuBar.add(mntmOpzioni);
		menuBar.add(azzeraMenu);
		//menuBar.add(help);
		button.doClick();
		
	}

	public static void main(String[] args) {
		
		int res=IscrizioniManager.accedi();
		if(IscrizioniManager.mySite==null || IscrizioniManager.mySite.isEmpty()){
			PanelUserEPass pup=new PanelUserEPass(true);
			pup.setVisible(true);
		}else{
			if(res==2){
				PanelUserEPass pup=new PanelUserEPass(true);
				pup.setVisible(true);
			}else{
				if(res==3){
					JOptionPane.showMessageDialog(null,"Errore: Il sito non è raggiungibile. \nControlla la connessione ad internet\n o semplicemente riprova più tardi");
					return;
				}
				apriGeicat();
			}
		}
	}
	
	protected static void apriGeicat(){
		FormSincronizzaIscrizioni fsi=new FormSincronizzaIscrizioni();
		fsi.setVisible(true);
		fsi.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
		fsi.setSize(700,450);
		fsi.setPreferredSize(new Dimension(700,450));
		fsi.setResizable(true);
		fsi.setTitle("Ge.I.Cat.");
		fsi.setLocationRelativeTo(null);
	}
	
	
}
